热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如果`atomic<T>`是无锁的,并且大小与`T`相同,那么内存布局是否相同?

如何解决《如果`atomic<T>`是无锁的,并且大小与`T`相同,那么内存布局是否相同?》经验,为你挑选了1个好方法。

这里这个问题表明,std::atomic普遍认为有大小相同T,而事实上,这似乎是对GCC,铛,和MSVC在x86,x64和ARM的情况。

std::atomic某个类型始终无锁的实现中T,是否保证其内存布局与的内存布局相同T?是否还有其他特殊要求std::atomic,例如对齐?



1> ζ--..:

在查看[atomics.types.generic]时,您链接的答案部分引用了该报价,关于对齐的唯一说明是您之前看到的注释:

注意:原子专业化的表示形式不必与其相应的参数类型相同。专门化的大小应尽可能相同,因为这可以减少移植现有代码所需的工作量

在较新的版本中:

原子专业化的表示形式与其对应的参数类型不必具有相同的大小和对齐要求。

此外,至少有一个架构IA64 对诸如的指令的原子行为提出了要求cmpxchg.acq,这表明以IA64为目标的编译器很可能需要以与非原子类型不同的方式对齐原子类型,即使没有锁也是如此。 。

此外,使用诸如压缩结构之类的编译器功能将导致原子和非原子变体之间的对齐方式不同。考虑以下示例:

#include 
#include 
struct __attribute__ ((packed)) atom{
    char a;
    std::atomic_long b;
};
struct __attribute__ ((packed)) nonatom{
    char a;
    long b;
};

atom atom1;
nonatom nonatom1;
int disp_aligns(int num) {
    std::cout<

上的至少一个配置中,对准atom1.b将是一个8字节的边界上,而对准nonatom1.b将是1个字节的边界上。但是,这是在我们要求打包结构的前提下进行的。目前尚不清楚您是否对此案感兴趣。


推荐阅读
author-avatar
命运2502901041_350
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有